﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Change;

namespace ReflectionExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("假装是一个插件系统");
            try
            {
                Console.WriteLine("通过使用插件对数据加工处理");
                // 定义用于模拟的数据
                string test = "abcdefgABCDEFG123456";
                // 取得当前程序目录下的plugs目录的路径
                string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "plugs");
                // 判断路径是否存在,如果不存在则创建路径
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
                
                // 取得plugs目录下所有的dll文件路径
                string[] files = Directory.GetFiles(path, "*.dll");
                // 定义一个列表存储所有加载进来的dll
                List<IChange> listChange = new List<IChange>();
                // 将所有dll通过反射加载进来
                foreach(var file in files)
                {
                    // 加载路径下程序集
                    Assembly assembly = Assembly.LoadFile(file);
                    // 获取程序集中定义的公共类型
                    Type[] types = assembly.GetExportedTypes();
                    // 返回可以转换为IChange的类型
                    Type type = types.FirstOrDefault(m => typeof(IChange).IsAssignableFrom(m));
                    if (type!=null)
                    {
                        // 实例化指定类型的对象
                        IChange changeValue = (IChange) Activator.CreateInstance(type);
                        // 将实例化的对象添加到对象集合中
                        listChange.Add(changeValue);
                    }
                }

                Console.WriteLine("请选择要进行的操作");
                for (int i = 0; i < listChange.Count; i++)
                {
                    Console.WriteLine(i+" : "+listChange[i].Name);
                }
                // 读取选择的操作
                int select = Convert.ToInt32(Console.ReadLine());
                if (select<0||select>listChange.Count-1)
                {
                    Console.WriteLine("选择有误，请重新选择");
                }
                // 调用通过反射实例化的对象的方法
                string result = listChange[select].Change(test);
                Console.WriteLine(result);


            }
            catch(Exception e)
            {
                Console.WriteLine("插件异常");
                Console.WriteLine(e.Message);
            }
            finally
            {
                Console.WriteLine();
            }
        }
    }
}
